%% 为子系统添加必要的端口
function add_subsystem_ports(model_name)
    if nargin < 1
        model_name = 'SVG_Star_10kV_Complete';
    end
    
    % 确保模型已打开
    if ~bdIsLoaded(model_name)
        open_system(model_name);
    end
    
    fprintf('开始为子系统添加端口...\n\n');
    
    %% 1. 修改Star_SVG子系统 - 添加三相电力端口
    fprintf('1. 处理Star_SVG子系统...\n');
    try
        svg_path = [model_name '/Star_SVG'];
        
        % 检查是否已有Grid_Connection端口
        grid_conn_path = [svg_path '/Grid_Connection'];
        if exist_block(grid_conn_path)
            % 删除原有的信号端口
            delete_block(grid_conn_path);
            fprintf('   删除原有的Grid_Connection信号端口\n');
        end
        
        % 添加三相电力连接端口（使用Connection Port）
        add_block('nesl_utility/Connection Port', [svg_path '/Grid_ABC']);
        set_param([svg_path '/Grid_ABC'], 'Position', [50 150 80 180]);
        set_param([svg_path '/Grid_ABC'], 'Side', 'Left');
        
        % 如果需要输出端口
        add_block('nesl_utility/Connection Port', [svg_path '/SVG_Out']);
        set_param([svg_path '/SVG_Out'], 'Position', [600 150 630 180]);
        set_param([svg_path '/SVG_Out'], 'Side', 'Right');
        
        fprintf('   已添加三相电力端口到Star_SVG\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
        fprintf('   尝试备选方案...\n');
        
        % 备选方案：保持原有设计，但需要在内部添加电力转换
        try
            svg_path = [model_name '/Star_SVG'];
            % 在子系统内部添加三相电压源或连接点来接收Grid_Connection的信号
            fprintf('   建议: 在Star_SVG内部添加信号到电力的转换模块\n');
        catch
            fprintf('   无法修改Star_SVG\n');
        end
    end
    
    %% 2. 修改Mixed_Load子系统 - 添加三相输入端口
    fprintf('\n2. 处理Mixed_Load子系统...\n');
    try
        load_path = [model_name '/Mixed_Load'];
        
        % 添加三相电力输入端口
        add_block('nesl_utility/Connection Port', [load_path '/Grid_Input']);
        set_param([load_path '/Grid_Input'], 'Position', [50 175 80 205]);
        set_param([load_path '/Grid_Input'], 'Side', 'Left');
        
        % 在子系统内部，需要将此端口连接到各个负载
        % 获取内部负载模块
        industrial = [load_path '/Industrial'];
        commercial = [load_path '/Commercial'];
        residential = [load_path '/Residential'];
        load_conn = [load_path '/Load_Connection'];
        
        % 连接Grid_Input到Load_Connection（如果存在）
        if exist_block(load_conn)
            % 这里需要在子系统内部进行连接
            fprintf('   需要在Mixed_Load内部连接Grid_Input到Load_Connection\n');
        end
        
        fprintf('   已添加三相输入端口到Mixed_Load\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
    end
    
    %% 3. 修改Measurements子系统 - 添加测量端口
    fprintf('\n3. 处理Measurements子系统...\n');
    try
        meas_path = [model_name '/Measurements'];
        
        % 为测量系统添加输入输出端口
        % 电网测量输入
        add_block('nesl_utility/Connection Port', [meas_path '/Grid_In']);
        set_param([meas_path '/Grid_In'], 'Position', [50 50 80 80]);
        set_param([meas_path '/Grid_In'], 'Side', 'Left');
        
        % 电网测量输出（传递）
        add_block('nesl_utility/Connection Port', [meas_path '/Grid_Out']);
        set_param([meas_path '/Grid_Out'], 'Position', [200 50 230 80]);
        set_param([meas_path '/Grid_Out'], 'Side', 'Right');
        
        % SVG测量输入
        add_block('nesl_utility/Connection Port', [meas_path '/SVG_In']);
        set_param([meas_path '/SVG_In'], 'Position', [50 150 80 180]);
        set_param([meas_path '/SVG_In'], 'Side', 'Left');
        
        % SVG测量输出（传递）
        add_block('nesl_utility/Connection Port', [meas_path '/SVG_Out']);
        set_param([meas_path '/SVG_Out'], 'Position', [200 150 230 180]);
        set_param([meas_path '/SVG_Out'], 'Side', 'Right');
        
        % 测量信号输出（到控制系统）
        add_block('simulink/Sinks/Out1', [meas_path '/Meas_Signals']);
        set_param([meas_path '/Meas_Signals'], 'Position', [400 100 430 120]);
        
        fprintf('   已添加测量端口到Measurements\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
    end
    
    %% 4. 修改Control_System子系统 - 添加控制端口
    fprintf('\n4. 处理Control_System子系统...\n');
    try
        ctrl_path = [model_name '/Control_System'];
        
        % 添加测量信号输入
        add_block('simulink/Sources/In1', [ctrl_path '/Meas_Input']);
        set_param([ctrl_path '/Meas_Input'], 'Position', [50 100 80 120]);
        
        % 添加PWM输出（到SVG）
        add_block('simulink/Sinks/Out1', [ctrl_path '/PWM_Out']);
        set_param([ctrl_path '/PWM_Out'], 'Position', [600 200 630 220]);
        
        % 添加模式选择输入（可选）
        add_block('simulink/Sources/In1', [ctrl_path '/Mode_Select']);
        set_param([ctrl_path '/Mode_Select'], 'Position', [50 200 80 220]);
        
        fprintf('   已添加控制端口到Control_System\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
    end
    
    %% 5. 修改Energy_Storage子系统 - 添加储能连接端口
    fprintf('\n5. 处理Energy_Storage子系统...\n');
    try
        storage_path = [model_name '/Energy_Storage'];
        
        % 为每相添加DC输出端口（连接到SVG的H桥）
        phases = {'A', 'B', 'C'};
        for i = 1:length(phases)
            port_name = ['DC_' phases{i}];
            add_block('simulink/Sinks/Out1', [storage_path '/' port_name]);
            set_param([storage_path '/' port_name], 'Position', [500 50+100*(i-1) 530 70+100*(i-1)]);
        end
        
        % 添加控制输入（来自控制系统）
        add_block('simulink/Sources/In1', [storage_path '/Control_In']);
        set_param([storage_path '/Control_In'], 'Position', [50 200 80 220]);
        
        fprintf('   已添加储能端口到Energy_Storage\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
    end
    
    %% 6. 更新Display_System子系统
    fprintf('\n6. 处理Display_System子系统...\n');
    try
        disp_path = [model_name '/Display_System'];
        
        % 添加各种测量信号输入
        signal_names = {'Grid_V', 'Grid_I', 'SVG_V', 'SVG_I', 'Power', 'DC_V', 'SOC'};
        
        for i = 1:length(signal_names)
            add_block('simulink/Sources/In1', [disp_path '/' signal_names{i} '_In']);
            set_param([disp_path '/' signal_names{i} '_In'], ...
                      'Position', [50 50+60*(i-1) 80 70+60*(i-1)]);
        end
        
        fprintf('   已添加显示输入端口到Display_System\n');
    catch ME
        fprintf('   错误: %s\n', ME.message);
    end
    
    fprintf('\n端口添加完成！\n');
    fprintf('\n注意事项：\n');
    fprintf('1. 需要在各子系统内部连接新添加的端口\n');
    fprintf('2. Connection Port用于电力连接，In/Out用于信号连接\n');
    fprintf('3. 如果Connection Port不可用，使用PMIOPort作为替代\n');
    fprintf('4. 运行connect_svg_model重新尝试连接\n');
end

%% 辅助函数：检查模块是否存在
function exists = exist_block(block_path)
    try
        get_param(block_path, 'Handle');
        exists = true;
    catch
        exists = false;
    end
end